package com.sugon.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.sugon.dao.ModulPositionCorrelationDao;
import com.sugon.dao.ModuleArchivesDao;
import com.sugon.entity.ModulPositionCorrelationEntity;
import com.sugon.entity.ModuleArchivesEntity;
import com.sugon.modules.mold.model.MoldCorrPositionCostStatVO;
import com.sugon.modules.mold.model.MoldCostStatVO;
import com.sugon.service.ModulPositionCorrelationService;
import com.sugon.utils.Constant;
import com.sugon.utils.excel.ExcelImport;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static com.sugon.utils.ShiroUtils.getUserId;

/**
 * 模具位置关联Service实现类
 *
 * @author YuXD
 * @date 2023-02-26
 */
@Service("modulPositionCorrelationService")
public class ModulPositionCorrelationServiceImpl implements ModulPositionCorrelationService {

    @Resource
    private ModulPositionCorrelationDao moldPositionCorrelationDao;
    @Resource
    private ModuleArchivesDao moldDao;

    @Override
    public void clearAll(String moldId) {
        moldPositionCorrelationDao.deleteByMoldId(moldId);
    }

    @Override
    public List<MoldCostStatVO> moduleCostStat(String moduleNo, String moduleCode, String year) {
        // 年份如果为空，默认统计当前年的
        if (StrUtil.isEmpty(year)) {
            year += DateUtil.thisYear();
        }
        List<MoldCostStatVO> moduleCostStatList = moldPositionCorrelationDao.moduleCostStat(moduleNo, moduleCode, year);
        if (moduleCostStatList == null) {
            moduleCostStatList = new ArrayList<>();
        }
        return moduleCostStatList;
    }

    @Override
    public List<MoldCorrPositionCostStatVO> costStat(String moduleCorrelationPositionId, String year) {
        List<MoldCorrPositionCostStatVO> costStatResult = new ArrayList<>();
        // 年份如果为空，默认统计当前年的
        if (StrUtil.isEmpty(year)) {
            year += DateUtil.thisYear();
        }
        // 统计指定位置的已存在的成本统计
        List<MoldCorrPositionCostStatVO> costStatList = moldPositionCorrelationDao.costStat(moduleCorrelationPositionId, year);
        Map<String, MoldCorrPositionCostStatVO> costStatMap = new HashMap<>();
        if (CollectionUtil.isNotEmpty(costStatList)) {
            for (MoldCorrPositionCostStatVO costStat : costStatList) {
                costStatMap.put(costStat.getMonth(), costStat);
            }
        }
        // 获取本年度的月份列表
        List<String> currentYearMonths = com.sugon.modules.utils.DateUtil.getYearMonths(year);
        MoldCorrPositionCostStatVO moduleCorrPositionCostStat;
        for (String currentYearMonth : currentYearMonths) {
            moduleCorrPositionCostStat = costStatMap.get(currentYearMonth);
            if (moduleCorrPositionCostStat == null) {
                moduleCorrPositionCostStat = new MoldCorrPositionCostStatVO(currentYearMonth);
            }
            costStatResult.add(moduleCorrPositionCostStat);
        }
        return costStatResult;
    }

    @Override
    public ModulPositionCorrelationEntity queryObject(String id) {
        return moldPositionCorrelationDao.queryObject(id);
    }

    @Override
    public List<ModulPositionCorrelationEntity> queryList(Map<String, Object> map) {
        return moldPositionCorrelationDao.queryList(map);
    }

    @Override
    public List<ModulPositionCorrelationEntity> queryListByMoldId(String moldId) {
        Map<String, Object> param = MapUtil.newHashMap();
        param.put("moldId", moldId);
        return queryList(param);
    }

    @Override
    public int queryTotal(Map<String, Object> map) {
        return moldPositionCorrelationDao.queryTotal(map);
    }

    @Override
    public int save(ModulPositionCorrelationEntity modulPositionCorrelation) {
        //当前模次数，默认为0
        modulPositionCorrelation.setCurrentTime(0);
        //套数
        modulPositionCorrelation.setSetNum(0);
        // 默认已同步
        modulPositionCorrelation.setIsNewSyn(1);
        // 默认正常使用
        modulPositionCorrelation.setPosStatus(1);

        modulPositionCorrelation.setId(RandomUtil.randomString(32));
        modulPositionCorrelation.setCreateTime(DateUtil.date());
        modulPositionCorrelation.setCreateUser(getUserId());
        modulPositionCorrelation.setDelFlag(Integer.valueOf(Constant.IS_NOT_DEL));
        return moldPositionCorrelationDao.save(modulPositionCorrelation);
    }

    @Override
    public int update(ModulPositionCorrelationEntity modulPositionCorrelation) {
        modulPositionCorrelation.setUpdateTime(DateUtil.date());
        modulPositionCorrelation.setUpdateUser(getUserId());
        return moldPositionCorrelationDao.update(modulPositionCorrelation);
    }

    @Override
    public int delete(String id) {
        return moldPositionCorrelationDao.delete(id);
    }

    @Override
    public int deleteBatch(String[] ids) {
        return moldPositionCorrelationDao.deleteBatch(ids);
    }

    @Override
    public int importE(MultipartFile file) {
        // 创建模具键值对，以模具号为key,模具编码为value
        Map<String, String> modules = new HashMap<>();
        List<ModuleArchivesEntity> moduleArchivesList = moldDao.queryList(null);
        moduleArchivesList.forEach(module -> {
            modules.put(module.getModuleNo(), module.getModuleCode());
        });
        //获取所有表格数据
        List<String[]> list = ExcelImport.getExcelData(file);
        int count = 0;
        if (list != null && list.size() != 0) {
            for (int i = 1; i < list.size(); i++) {
                boolean isExist = true;
                String[] array = ArrayUtil.resize(list.get(i), 9);
                // 模具编码必填
                if (StrUtil.isEmpty(array[0])) {
                    continue;
                }
                // 模具位置必填
                if (StrUtil.isEmpty(array[1])) {
                    continue;
                }
                // 位置号必填
                if (StrUtil.isEmpty(array[2])) {
                    continue;
                }
                // 寿命标准必填
                if (StrUtil.isEmpty(array[5])) {
                    continue;
                }
                // 首先根据模具号+备件名称+位置号，唯一查询模具关联位置是否存在，如果存在则更新，否则新增
                List<ModulPositionCorrelationEntity> mpcList = moldPositionCorrelationDao.queryByCondition(array[0], array[1], array[2]);
                ModulPositionCorrelationEntity mpc;
                if (CollectionUtil.isNotEmpty(mpcList)) {
                    mpc = mpcList.get(0);
                } else {
                    isExist = false;
                    mpc = new ModulPositionCorrelationEntity();
                }
                mpc.setPositionName(array[1]);
                mpc.setPositionNo(array[2]);
                // 规格
                if (StrUtil.isNotEmpty(array[3])) {
                    mpc.setSpec(array[3]);
                }
                // 类型
                if (StrUtil.isNotEmpty(array[4])) {
                    mpc.setModType(array[4]);
                }
                // 设置寿命标准
                mpc.setLifeStandard(Integer.parseInt(array[5]));
                // 特殊处理
                mpc.setPositionRemark(array[6]);
                // 当前使用次数
                if (StrUtil.isNotEmpty(array[7])) {
                    mpc.setCurrentTime(Integer.parseInt(array[7]));
                }
                // 适用型芯条码规格列表
                if (StrUtil.isNotEmpty(array[8])) {
                    mpc.setBarCodeRange(array[8]);
                }
                count += isExist ? update(mpc) : save(mpc);
            }
        }
        return count;
    }
}
